/**
 * @brief 文件句柄管理类
 */

#ifndef __FD_MANAGER_H__
#define __FD_MANAGER_H__

#include <memory>
#include <vector>
#include "singleton.h"
#include "thread.h"

/**
 * @brief 文件句柄上下文类
 */
class FdCtx : public std::enable_shared_from_this<FdCtx>
{
public:
    typedef std::shared_ptr<FdCtx> ptr;

    FdCtx(int fd);
    ~FdCtx();

    // 是否初始化完成
    bool isInit() const { return m_isInit; }

    // 是否socket
    bool isSocket() const { return m_isSocket; }

    // 是否已经关闭
    bool isClose() const { return m_isClosed; }

    // 设置用户主动设置非阻塞
    void setUserNonblock(bool v) { m_userNonblock = v; }

    // 获取是否用户主动设置的非阻塞
    bool getUserNonblock() const { return m_userNonblock; }

    // 设置系统非阻塞
    void setSysNonblock(bool v) { m_sysNonblock = v; }

    // 获取系统非阻塞
    bool getSysNonblock() { return m_sysNonblock; }

    // 设置超时时间
    // type SO_RECVTIMEO(读超时) SO_SENDTIMEO(写超时)
    void setTimeout(int type, uint64_t timeout);

    // 获取超时时间
    uint64_t getTimeout(int type);

private:
    // 初始化
    bool init();

private:
    // 是否初始化
    bool m_isInit : 1;
    // 是否socket
    bool m_isSocket : 1;
    // 是否hook非阻塞
    bool m_sysNonblock : 1;
    // 是否用户主动设置非阻塞
    bool m_userNonblock : 1;
    // 是否关闭
    bool m_isClosed : 1;
    // 文件句柄
    int m_fd;
    // 读超时时间毫秒
    uint64_t m_recvTimeout;
    // 写超时时间毫秒
    uint64_t m_sendTimeout;
};

/**
 * @brief 文件句柄管理类
 */

class FdManager
{
public:
    typedef RWMutex RWMutexType;
    FdManager();

    // 返回fd对应的上下文,存在直接返回,不存在就插入（自动插入为true）
    FdCtx::ptr get(int fd, bool auto_create = false);

    // 删除文件句柄
    void del(int fd);

private:
    // 读写锁
    RWMutexType m_mutex;
    // 文件句柄集合
    std::vector<FdCtx::ptr> m_datas;
};

// 文件句柄单例
typedef Singleton<FdManager> FdMgr;

#endif